﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;
using csNotificaciones;

namespace MotorMetricas.Logica
{
    public class MetricaBloquesAnidados : AbstractMetrica
    {
        override public int Generar(String ruta)
        {
            ManejoArchivo Manejador = new ManejoArchivo();
            ArrayList misarchivos = null;
            Boolean SinError = true;
            int NumeroBloquesAnidados = 0;

            if (Manejador.ValidarRuta(ruta))
            {
                /*
                 * el metodo ObtenerArchivos devuelve el Array de strings con las direcciones
                 * de todos los archivos a evaluar, recorriendo todas las subcarpetas
                 */
                misarchivos = Manejador.ObtenerArchivos(ruta);
            }
            else
            {
                SinError = false;
                //Console.WriteLine("ERROR: Ruta invalida");
            }

            if (SinError)
            {

                foreach (String rutaArchivo in misarchivos)
                {
                    if (Manejador.ValidarArchivo(rutaArchivo))
                    {
                        NumeroBloquesAnidados = ContarBloquesAnidados(rutaArchivo,NumeroBloquesAnidados);
                    }
                }
            }
            Notificacion.mostrarVentana("Metrica de Bloques Anidados", "La metrica se ha generado con éxito\nResultado: " + NumeroBloquesAnidados.ToString(), Notificacion.Imagen.Ok, 2);
            return NumeroBloquesAnidados;
        }

        // Metodo que cuenta la cantidad de bloques anidados de los metodos
        public int ContarBloquesAnidados(string rutaArchivo, int bloquesReturn )
        {
            int numero = 0;
            int bloques;
            string linea = null;
            try
            {
                StreamReader archivo = new StreamReader(rutaArchivo);
                while ((linea = archivo.ReadLine()) != null)
                {
                    bloques = 0;
                    // Revisa que sea un metodo
                    if ((linea.Contains("public")) || (linea.Contains("private")))
                        if ((linea.Contains("(")) && (linea.Contains(")")))
                        {
                            //Lee el metodo unicamente
                            while ((linea = archivo.ReadLine()) != null)
                            {
                                // Revisa que se abra un bloque
                                if (linea.Contains("{"))
                                {
                                    bloques++;
                                    numero++;
                                }
                                    // Revisa que se cierre el bloque
                                else if (linea.Contains("}"))
                                {
                                    numero--;
                                    // Si numero es 0 es porque el metodo se acabo y cierra el 2do while
                                    if (numero.Equals(0))
                                        break;
                                }
                            }
                        }

                    // Revisa que numero de bloques es mayor para retornarlo 
                    if (bloquesReturn.Equals(0))
                        bloquesReturn = bloques;
                    else if (bloques > bloquesReturn)
                        bloquesReturn = bloques;

                }
                archivo.Close();
            }
            catch (Exception)
            {
                Notificacion.mostrarVentana("Metrica de Bloques Anidados", "Ha ocurrido un error al generar esta metrica", Notificacion.Imagen.Error, 1);
            }

            return bloquesReturn;
        }


    }
}
